package cn.edu.zsc.rbac.service.collection;

import cn.edu.zsc.rbac.domain.dto.BaseDto;
import cn.edu.zsc.rbac.domain.entity.BaseEntity;
import cn.edu.zsc.rbac.domain.vo.BaseVo;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.service.IBaseService;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Deprecated
abstract class BaseService<Entity extends BaseEntity, Dto extends BaseDto, Vo extends BaseVo> implements IBaseService<Entity, Dto> {
    @Override
    public boolean existsById(int id) {
        return data.containsKey(id);
    }

    @Override
    public Entity findById(int id) {
        if (existsById(id)) {
            return data.get(id);
        }
        return null;
    }

    @Override
    public Result list() {
        List<Vo> list =
                data.values().stream().map(this::convertToVo).toList();
        // 将 VO 列表转换为数组并封装返回结果
        return Result.success("查询成功", list.toArray(temp));
    }

    @Override
    public Result create(Dto dto) {
        // 使⽤传⼊的dto对象和id值，创建新的实体对象，
        Entity entity = createEntity(dto, idCounter++);
        data.put(entity.getId(), entity);
        // 返回成功结果
        return Result.success("创建成功", null);
    }

    @Override
    public Result update(Dto dto, int id) {
        // 检查提供的 ID 是否有效：ID ⼩于 1，ID 超出有效范围，或者该 ID 对应的数据为空
        if (!existsById(id)) {
            // 如果 ID ⽆效，返回更新失败的结果
            return Result.failure("更新失败，不存在该数据");
        }
        // 获取指定 ID 的实体对象
        Entity entity = data.get(id);
        // 使⽤传⼊的dto对象，更新实体对象
        updateEntity(dto, entity);
        // 返回更新成功的结果
        return Result.success("更新成功", null);
    }
    Map<Integer, Entity> data = new HashMap<>();
    /**
     * ID 计数器
     */
    private int idCounter = 1;
    /**
     * 视图对象临时数组
     */
    Vo[] temp;
    abstract Vo convertToVo(Entity entity);
    abstract Entity createEntity(Dto dto, int id);
    abstract void updateEntity(Dto dto, Entity entity);
}
